package com.berchen.Callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 创建线程方式三：实现Callable接口。相较于实现Runable接口，Callable接口方法有返回值，并且方法可以抛出异常。
 *  执行Callable方式，需要FutureTask实现类的支持，用于接收运算结果。FutureTask是Future的实现类。
 */
public class TestCallable {

    public static void main(String[] args){

        CallableThread st=new CallableThread();

        FutureTask<Integer> ft = new FutureTask<>(st);
        new Thread(ft).start(); // 启动线程

        Integer integer = null; // 获取方法的返回值
        try {
            integer = ft.get(); // get方法必须要在上面线程执行完成之后才会获取结果。就相当于闭锁（CountDownLatch）。
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println(integer);
    }
}
class CallableThread implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {

        int sum=0;
        for(int i=0;i<100;i++){

            sum+=i;
        }
        return sum;
    }
}
